java API中ScheduledExecutorService定时器的使用
package com.timer;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 异常监听定时器
* @author Administrator
*
*/
public class SMSTimerTask{
int i = 1; //设定一个判断的标准,当然了,可以根据自己的项目需要设置判断的标准是什么,我这里只是做了简单的例子程序
// 线程池能按时间计划来执行任务,允许用户设定计划执行任务的时间,int类型的参数是设定
// 线程池中线程的最小数目。当任务较多时,线程池可能会自动创建更多的工作线程来执行任务
public ScheduledExecutorService scheduExec = Executors
.newScheduledThreadPool(10);
// 启动计时器,叫这个名字有点怪怪的,因为是例子,而且调用这个方法后,lanuchTimer()方法确实就开始运行,所有干脆就起了这么一个名字
public void lanuchTimer() {
Runnable task = new Runnable() {
public void run() {
System.out.println("第"+i+++"次运行");
}
};
scheduExec.scheduleWithFixedDelay(task, 1000 * 5, 1000 * 10,
TimeUnit.MILLISECONDS);
}
// 添加一个新监听到的任务 这个你就可以对你想要监听的异常地方在run()方法中进行相应的处理
public void addOneTask(final String a) {
Runnable task = new Runnable() {
public void run() {
i++;
System.out.println("welcome to china "+a);
if(i == 4){
System.out.print("已经尝试执行三次,但链接还是未成功,记录状态,终止当前线程操作!");
scheduExec.shutdownNow();
}else{
}
}
};
//启动当前任务
scheduExec.scheduleAtFixedRate(task, 1, 5,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws Exception {
SMSTimerTask testA = new SMSTimerTask();
SMSTimerTask testB = new SMSTimerTask();
//test.lanuchTimer();
//Thread.sleep(1000 * 5); // 5秒钟之后添加新任务
testA.addOneTask("aaa");
testB.addOneTask("bbb");
}
}
/**
具体的请看util包底下的三个类,学习java基础就这样,使劲抠最基本的东西 java.util.concurrent
一下是网上找的内容:
Timer和ScheduledThreadPoolExecutor
但ScheduledThreadPoolExecutor和Timer相比具有以下优点:
Timer对调度的支持是基于绝对时间的,因此任务对系统时间的改变是敏感的;而ScheduledThreadPoolExecutor支持相对时间。
Timer使用单线程方式来执行所有的TimerTask,如果某个TimerTask很耗时则会影响到其他TimerTask的执行;而ScheduledThreadPoolExecutor则可以构造一个固定大小的线程池来执行任务。
Timer不会捕获由TimerTask抛出的未检查异常,故当有异常抛出时,Timer会终止,导致未执行完的TimerTask不再执行,新的TimerTask也不能被调度;ScheduledThreadPoolExecutor对这个问题进行了妥善的处理,不会影响其他任务的执行。
因此在JDK1.5以后就基本上都是使用ScheduledThreadPoolExecutor了。
想要了解的更深,就使劲抠API文档吧
*/